package com.sgcc.pda.hzaidl.impl;




import com.sgcc.pda.hw.ICommonUtilManager2;
import com.sgcc.pda.hw.MeterAuthorityInfo;
import com.sgcc.pda.hw.ReturnResult;


import org.json.JSONException;
import org.json.JSONObject;

/**
 * @创建者：suven on 2019/12/17 9:09
 * @描述：
 * @版本：1.0
 * @修改人：
 * @修改时间：
 * @修改说明：
 * @修改版本：
 */
public class CommonUtilManager2 extends ICommonUtilManager2.Stub {
    private static CommonUtilManager2 mInstance;

    /**
     * 单例
     *
     * @return
     */
    public static synchronized CommonUtilManager2 getInstance() {
        if (mInstance == null) {
            mInstance = new CommonUtilManager2();
        }
        return mInstance;
    }

    /**
     * 电表进行红外身份认证（使用之前先进行调用meterRegisterAuthInfo注册红外相关权限）
     *
     * @param meterAddress 表地址
     * @param esamType     ESAM类型  01，操作员ESAM；02业务ESAM
     * @param randomLength 随机数长度  4，8，16
     * @param keyType      密钥类型 00公钥 01私钥
     * @param operator     操作员编号
     * @param infraAuth    电能表红外权限
     * @param idAuth       电能表身份认证权限
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    @Override
    public ReturnResult infraIdentity(String meterAddress, String esamType, String randomLength, String keyType, String operator, MeterAuthorityInfo infraAuth, MeterAuthorityInfo idAuth, int mode) {
        com.alibaba.fastjson.JSONObject jb = new com.alibaba.fastjson.JSONObject();
        jb.put("meterAddress", meterAddress);
        jb.put("esamType", esamType);
        jb.put("randomLength", randomLength);
        jb.put("keyType", keyType);
        jb.put("operator", operator);
        jb.put("infraAuth", infraAuth);
        jb.put("idAuth", idAuth);
        jb.put("mode", mode);
        return HardWareUtil.requestHardwareData("unit2Complex_infraIdentity", jb.toString());

    }

    /**
     * 电表进行远程身份认证
     *
     * @param meterAddress 表地址
     * @param keyType      密钥类型 00公钥 01私钥
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:rand2 执行远程身份认证之后获取的电表随机数2
     * 1:esamNo 执行身份认证之后获取的电表ESAM编号
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    @Override
    public ReturnResult remoteIdentity(String meterAddress, String keyType, String operator, MeterAuthorityInfo idAuth, int mode) {
        com.alibaba.fastjson.JSONObject jb = new com.alibaba.fastjson.JSONObject();
        jb.put("meterAddress", meterAddress);
        jb.put("keyType", keyType);
        jb.put("operator", operator);
        jb.put("idAuth", idAuth);
        jb.put("mode", mode);
        return HardWareUtil.requestHardwareData("unit2Complex_remoteIdentity", jb.toString());
    }

    /**
     * 698电表建立连接（秘钥协商）
     *
     * @param meterAddress 表地址
     * @param idAuth       身份认证权限
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult makeConnection698(String meterAddress, MeterAuthorityInfo idAuth, int mode, boolean checkDar) {
        com.alibaba.fastjson.JSONObject jb = new com.alibaba.fastjson.JSONObject();
        jb.put("meterAddress", meterAddress);
        jb.put("idAuth", idAuth);
        jb.put("mode", mode);
        jb.put("checkDar", checkDar);

        return HardWareUtil.requestHardwareData("unit2Complex_makeConnection698", jb.toString());

    }

    /**
     * 698电表建立连接（秘钥协商）
     *
     * @param meterAddress 表地址
     * @param taskData     要发送的数据
     * @param safeType     安全类型
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendData698(String meterAddress, String taskData, String safeType, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {

            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("safeType", safeType);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendData698", jb.toString());
    }

    /**
     * 698安全传输记录型报文(针对冻结类数据)
     *
     * @param meterAddress 表地址
     * @param taskData     要发送的数据
     * @param safeType     安全类型
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendRecordData698(String meterAddress, String taskData, String safeType, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("safeType", safeType);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendRecordData698", jb.toString());
    }

    /**
     * 698红外认证
     *
     * @param keyType      密钥类型 00公钥 01私钥
     * @param meterAddress 通信地址
     * @param infraAuth    红外权限
     * @param idAuth       身份认证权限
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult infraIdentity698(String keyType, String meterAddress, MeterAuthorityInfo infraAuth, MeterAuthorityInfo idAuth, int mode, boolean checkDar) {
        com.alibaba.fastjson.JSONObject jb = new com.alibaba.fastjson.JSONObject();
        jb.put("keyType", keyType);
        jb.put("meterAddress", meterAddress);
        jb.put("infraAuth", infraAuth);
        jb.put("idAuth", idAuth);
        jb.put("mode", mode);
        jb.put("checkDar", checkDar);
        return HardWareUtil.requestHardwareData("unit2Complex_infraIdentity698", jb.toString());

    }

    /**
     * 698安全传输读取报文(针对读取当前数据)
     *
     * @param meterAddress 表地址
     * @param taskData     要发送的数据
     * @param safeType     安全类型
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendReadData698(String meterAddress, String taskData, String safeType, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("safeType", safeType);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendReadData698", jb.toString());
    }

    /**
     * 698安全传输记录型报文(返回数据帧，由子应用根据功能独自解析)
     *
     * @param meterAddress 表地址
     * @param taskData     要发送的数据
     * @param safeType     安全类型
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendRecordData698ForFrameData(String meterAddress, String taskData, String safeType, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("safeType", safeType);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendRecordData698ForFrameData", jb.toString());
    }

    /**
     * 打开红外或串口
     *
     * @param mode 通信方式 0 默认普通红外 1串口 2普通红外 3 激光红外
     * @return 0成功 其他失败
     */
    public ReturnResult onInfraInit(int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", mode + "");
            //插件需要 key =mode   而极速版是 key = data
            jb.put("mode", mode + "");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_onInfraInit", jb.toString());
    }

    /**
     * 关闭红外或串口
     *
     * @param mode 通信方式 0 默认普通红外 1串口 2普通红外 3 激光红外
     * @return 0成功 其他失败
     */
    public ReturnResult onInfraDeInit(int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("data", mode + "");
            //插件需要 key =mode   而极速版是 key = data
            jb.put("mode", mode + "");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_onInfraDeInit", jb.toString());
    }

    /**
     * 设置通信超时时间，如何串口已经打开，则改变为关闭状态，需要重新打开后生效
     *
     * @param sendTimeOut    发送超时时间 毫秒
     * @param receiveTimeOut 接收超时时间 毫秒
     */
    public void setInfraTimeOut(int sendTimeOut, int receiveTimeOut) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("sendTimeOut", sendTimeOut);
            jb.put("receiveTimeOut", receiveTimeOut);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        HardWareUtil.requestHardwareData("unit2Complex_setInfraTimeOut", jb.toString());
    }

    /**
     * 698明文读取终端参数(针对读读取终端参数)
     *
     * @param tmnlAddress 表地址
     * @param taskData    要发送的数据
     * @param mode        通讯方式：0 红外  1 串口(485线)
     * @param checkDar    是否对698协议返回的dar标志进行判断（true： 判断，false：不判断）
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendPlainReadData698(String tmnlAddress, String taskData, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("tmnlAddress", tmnlAddress);
            jb.put("taskData", taskData);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendPlainReadData698", jb.toString());
    }

    /**
     * 698电表建立连接（秘钥协商） 设参分帧
     *
     * @param meterAddress 表地址
     * @param taskData     要发送的数据
     * @param safeType     安全类型
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * 0:linkUserData 链路数据域
     * :List<String> datas(code==其他):
     * 0：失败的描述
     */
    public ReturnResult sendData698Fz(String meterAddress, String taskData, String safeType, int mode, boolean checkDar) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("taskData", taskData);
            jb.put("safeType", safeType);
            jb.put("mode", mode);
            jb.put("checkDar", checkDar);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("unit2Complex_sendData698Fz", jb.toString());
    }

}
